package ar.edu.utn.frba.dds.aterrizar.aerolineas;

import java.util.ArrayList;

import com.lanchita.excepciones.CodigoErroneoException;

import ar.edu.utn.frba.dds.aterrizar.busquedas.Vuelo;
import ar.edu.utn.frba.dds.aterrizar.usuarios.Usuario;

public abstract class AerolineasInterface {
	
	public static OperadorDeAerolineas operador = OperadorDeAerolineas.getInstance();
	
	protected void validarVuelo(Vuelo vuelo, Usuario usuario) {
		if(!vuelo.esVisiblePara(this, usuario)) {
			throw new VueloNoVisibleException("El vuelo: " + vuelo.getCodigoDeVuelo() + "-" + vuelo.getCodigoDeAsiento() + " no es visible para " + usuario.getNombre() + " " + usuario.getApellido());
		}
	}
	
	public void comprarVuelo(Vuelo vuelo, Usuario usuario) {
		validarVuelo(vuelo, usuario);
		comprarElVuelo(vuelo, usuario);
	}
	
	public void reservarVuelo(Vuelo vuelo, Usuario usuario) {
		validarVuelo(vuelo, usuario);
		reservarElVuelo(vuelo, usuario);
	}
	
	protected abstract void comprarElVuelo(Vuelo vuelo, Usuario usuario);
	
	protected abstract void reservarElVuelo(Vuelo vuelo, Usuario usuario);

	public abstract ArrayList<Vuelo> getAsientosTotales();

	public abstract ArrayList<Vuelo> getAsientosBuscados(String origen, String destino,
			String fechaSalida, String horaSalida, String fechaLlegada, String horaLlegada);
	
	public abstract ArrayList<Vuelo> getAsientosBuscadosIncluyendoReservados(String origen, String destino,
			String fechaSalida, String horaSalida, String fechaLlegada, String horaLlegada);	
	
	public Vuelo encontrarVueloPorCodigo(String codigoDeVueloBuscado, String codigoDeAsientoBuscado) {
		ArrayList<Vuelo> vuelos = this.getAsientosTotales();
		for(Vuelo vuelo : vuelos) {
			if(vuelo.getCodigoDeVuelo().equalsIgnoreCase(codigoDeVueloBuscado) && vuelo.getCodigoDeAsiento().equalsIgnoreCase(codigoDeAsientoBuscado)) {

				return vuelo;
			}
		}
		throw new CodigoErroneoException(codigoDeVueloBuscado + "-" + codigoDeAsientoBuscado);
	}
	
	public float calcularPrecioDeUnVuelo(Vuelo vuelo, Usuario usuario) {
		return vuelo.getPrecioFinal(usuario);
	}
	public abstract String quienSoy();
	
}
